/*
 * 教材中的示例程序之完整版.
 * 书名：《编译原理基础》
 * 版次：第三版
 * 作者：王献青，张立勇，张淑平，刘坚
 * 出版社：西安电子科技大学出版社
 * 程序完成时间：2025.03
 */

//
// 文件内容：递归下降语法分析所需的词法分析API头文件
//

#ifndef CHAP03_LEXER_H
#define CHAP03_LEXER_H


// 声明全体记号类别
typedef enum TokenKind {
    EOFS  , /* 输入结束(EOF), 但此处不用EOF，它与系统头文件中的符号重名了 */
    ERROR , /* 发现一个词法错误 */
    ID,     NUM,    LP,     RP,
    PLUS,   MINUS,  MUL,    DIV,    MOD,
    SEMICO  /* ; */
} TokenKind;

#define WORDLEN_MAX   20    // 限定每个单词的最大长度
typedef struct token {      // 记号对象的数据结构
    TokenKind   kind;       // 记号类别
    char        word[WORDLEN_MAX+1];  // 单词
    int         line;       // 行号，从1开始
    int         column;     // 列号，从1开始
} t_token;

extern t_token globToken;

extern const char * lookup_kindname(TokenKind kind);

extern void  set_lexer_input(const char * input);
extern TokenKind  nextToken();

#endif //CHAP03_LEXER_H
